// 从下往上找最少的苹果数量
// 正面想有点复杂，那就从反面想
// 保留x个树枝最多能留住多少苹果
// 并把权重放到苹果身上，就变成了有依赖的背包问题
// 不过当前背包问题的权重是1
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 220, M = N * 2;
int n, q;
int e[M], ne[M], h[N], w[N], idx;
// dp[i][j]: 表示从以i为根的子树中选j个节点的最大苹果数量
int dp[N][N];

void add(int a, int b, int c)  // 添加一条边a->b，边权为c
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

void dfs(int root, int father, int left)
{
    if (!left) return;
    // 每一个根都是一个组
    for (int i = h[root]; ~i; i = ne[i])
    {
        if (e[i] == father) continue;
        dfs(e[i], root, left - 1);
        // 分组背包问题的模型
        for (int j = left; j >= 0; --j) // 以root点为根可以选取0 ~ left 个苹果
            for (int k = 0; k < j; ++k)
                dp[root][j] = max(dp[root][j], dp[e[i]][k] + dp[root][j - k - 1] + w[i]);
    }
}



int main()
{
    cin >> n >> q;
    memset(h, -1, sizeof h);

    for (int i = 0; i < n - 1; ++i)
    {
        int a, b, c;
        cin >> a >> b >> c;
        add(a, b, c), add(b, a, c);
    }
    dfs(1, -1, q);
    cout << dp[1][q] << endl;
    return 0;
}